/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package NajaTaskClient.classes;

import NajaTaskClient.Conexao.Db;
import NajaTaskClient.Conexao.DbTabela;
import NajaTaskClient.Conexao.DbTabelaColuna;
import NajaTaskClient.Conexao.ExcecaoGenericaMensagem;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ListIterator;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author nidorx
 */
public class Usuario implements Comparable<Usuario> {

    DbTabela tabelaUsuarios;
    xref_usuario_grupo xref = new xref_usuario_grupo();
    private String codigo;
    private String nome_usuario;
    private String nome;
    private String email;
    private int ativo;
    private boolean root = false;
    private String grupoNome;
    private String grupoCodigo;
    private int permissao;

    private void criarTabelas() {
        try {
            /*
            criando a estrutura no banco de dados se acaso não existir
             */
            /*tabela de Usuários */
            this.tabelaUsuarios = Db.get().dbTabelaAdicionar(new DbTabela("usuarios"));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("codigo", "INT", 11, false, false, true));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("nome", "VARCHAR", 100, false, false, false));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("nome_usuario", "VARCHAR", 100, false, false, false));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("senha", "VARCHAR", 100, false, false, false));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("ativo", "INT", 1, false, false, false));
            this.tabelaUsuarios.campoAdicionar(new DbTabelaColuna("permissao", "INT", 1, false, false, false));
        } catch (ExcecaoGenericaMensagem ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Usuario() {
        this.criarTabelas();
    }

    public Usuario(String codigo, String nome, String nome_usuario, int ativo) {
        this.criarTabelas();
        this.codigo = codigo;
        this.nome = nome;
        this.nome_usuario = nome_usuario;
        this.ativo = ativo;
    }
    /*usado na interface usuarioEditar.java*/

    public Usuario(String codigo) {
        this.criarTabelas();
        this.atualizarDados(codigo);
    }

    public boolean login(String nomeUsuario, String senha) {
        if (nomeUsuario.equals("root")) {
            this.root = true;
            this.codigo = "0";
            this.nome = "super-usuario";
            return true;

        } else {
            if (this.tabelaUsuarios.coluna("nome_usuario").inserido(nomeUsuario)) {
                ListIterator<String> iter = this.tabelaUsuarios.coluna("senha").where("nome_usuario=\'" + nomeUsuario + "\'").listIterator();
                String senhaBD = "";
                while (iter.hasNext()) {
                    senhaBD += iter.next();
                }
                if (senhaBD.equals(senha)) {
                    this.obterCodigoBDbyNome(nomeUsuario);
                    this.obterDadosBD();
                    return true;
                }

            }

        }




        return false;
    }

    /*obtém os dados do BD */
    private void obterDadosBD() {
        String nome = "";
        ListIterator<String> iter = this.tabelaUsuarios.coluna("nome").where("codigo=\'" + this.codigo + "\'").listIterator();
        while (iter.hasNext()) {
            nome += iter.next();
        }
        this.nome = nome;

    }

    public int ativo() {
        return this.ativo;
    }

    public void ativo(int ativo) {
        this.ativo = ativo;
    }

    private void obterCodigoBDbyNome(String nomeUsuario) {
        ListIterator<String> iter = this.tabelaUsuarios.coluna("codigo").where("nome_usuario=\'" + nomeUsuario + "\'").listIterator();
        String codigo = "";
        while (iter.hasNext()) {
            codigo += iter.next();
        }
        this.codigo = codigo;
    }

    public String obterCodigo() {
        return this.codigo;
    }

    public String obterNome() {
        return this.nome;
    }

    public int compareTo(Usuario o) {
        final int EQUAL = 0;
        final int AFTER = 1;
        if (this == o) {
            return EQUAL;
        }
        if (this.codigo.equals(o.codigo)) {
            return EQUAL;
        }
        return AFTER;
    }

    public ResultSet obterLista() {
        ResultSet rst = this.tabelaUsuarios.selectAll();
        return rst;
    }

    public Object obterEmail() {
        return this.email;
    }

    public Object obterGrupo() {
        return this.grupoNome;
    }

    public boolean novo(String nome, String nomeUsuario, int permissao, int grupo) {
        try {
            String dados = "nome=\'" + nome
                    + "\',nome_usuario=\'" + nomeUsuario
                    + "\',permissao=\'" + permissao
                    + "\',ativo=\'" + 1
                    + "\',senha=\'" + 123 + "\'";
            this.tabelaUsuarios.insert(dados);
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ExcecaoGenericaMensagem ex) {
            Logger.getLogger(Usuario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    private void atualizarDados(String codigo) {
        if (this.tabelaUsuarios.coluna("codigo").inserido(codigo)) {
            try {
                ResultSet rst = this.tabelaUsuarios.selectAllClausulaWhere("codigo=\'" + codigo + "\'");
                while (rst.next()) {
                    this.codigo = rst.getString("codigo");
                    this.nome = rst.getString("nome");
                    this.nome_usuario = rst.getString("nome_usuario");
                    this.ativo = rst.getInt("ativo");
                    this.permissao = rst.getInt("permissao");
                    String codigoGrupo = xref.obterCodigoGrupo(this.codigo);
                    if (codigoGrupo != "") {
                        this.grupoCodigo = codigoGrupo;
                    }

                    String nomeGrupo = new Grupo().obterTitulo(this.grupoCodigo);
                    if (nomeGrupo != "") {
                        this.grupoNome = nomeGrupo;
                    }

                }

            } catch (SQLException ex) {
                Logger.getLogger(Db.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public String obterNomeUsuario() {
        return this.nome_usuario;
    }

    public void setarGrupo(String codigo) {
        this.grupoCodigo = codigo;
    }

    public void setarPermissao(int permissao) {
        this.permissao = permissao;
    }

    /*atualiza os dados no banco de dados*/
    public boolean atualiza() {
        String dados = "permissao=\'" + this.permissao
                + "\',ativo=\'" + this.ativo + "\'";
        if (this.tabelaUsuarios.atualizarLinhaClausulaWhere(dados, "codigo=\'" + this.obterCodigo() + "\'")) {
            return true;
        }
        return false;
    }

    public int permissao() {
        return this.permissao;
    }
}
